#include <iostream>
#include <gtest/gtest.h>  // Google Test框架头文件
#include <unordered_map>  // 哈希表容器头文件

// 自定义测试夹具类（Test Fixture）
class MyTest : public testing::Test 
{
public:
    // 静态方法：在所有测试用例执行前运行（整个测试套件级别）
    static void SetUpTestCase() 
    {
        std::cout << "==== 全局初始化 ====\n";
        // 适合初始化全局共享资源（如数据库连接池）
        // 注意：此处初始化的数据会被所有测试用例共享（慎用）
    }

    // 实例方法：在每个测试用例执行前运行（测试用例级别）
    void SetUp() override 
    {
        std::cout << "[开始测试] 初始化...\n";
        // 初始化每个测试用例的独立环境
        _mymap.insert({"hello", "你好"});   // 插入初始测试数据
        _mymap.insert({"bye", "再见"});     // 每个测试用例都有独立副本
    }

    // 实例方法：在每个测试用例执行后运行（测试用例级别）
    void TearDown() override 
    {
        std::cout << "[结束测试] 清理...\n";
        _mymap.clear();  // 清理测试数据
        // 保证不同测试用例间的数据隔离
    }

    // 静态方法：在所有测试用例执行后运行（整个测试套件级别）
    static void TearDownTestCase() 
    { 
        std::cout << "==== 全局清理 ====\n";
        // 适合释放全局共享资源
    }

public:
    std::unordered_map<std::string, std::string> _mymap;  // 测试用例专用数据容器
};

/******************** 测试用例组 ********************/
// 验证插入功能的测试用例（使用TEST_F宏绑定夹具）
TEST_F(MyTest, insert_test) 
{
    // 初始已有2个元素（来自SetUp初始化）
    _mymap.insert({"leihou", "雷猴"});  // 插入第三个元素
    
    // 断言当前容器大小为3
    ASSERT_EQ(_mymap.size(), 3) << "插入后元素数量应为3";  // 带诊断信息
    
    // 测试结束后，TearDown会自动清理数据
}

// 验证初始大小的测试用例
TEST_F(MyTest, size_test) 
{
    // 直接验证SetUp初始化的元素数量
    ASSERT_EQ(_mymap.size(), 2) << "初始元素数量应为2";
    
    // 注意：此处不会受到insert_test的影响，因为夹具保证环境隔离
}

/******************** 主函数 ********************/
int main(int argc, char *argv[]) 
{
    // 初始化Google Test框架（解析命令行参数）
    testing::InitGoogleTest(&argc, argv);
    
    // 运行所有测试用例，返回测试结果（0表示全部成功）
    return RUN_ALL_TESTS();
}
